
//修剪灌木
// #include <iostream>
// #include <vector>
// using namespace std;

// int main()
// {
//     int n = 0;
//     cin >> n;
//     int mid = n / 2;
//     vector<int> arr(mid + 1);

//     if (n%2 == 0)
//     {
//         for (int i = 0; i < mid; ++i)
//         {
//             arr[i] = 2 * n - (2 * i + 2);
//             cout << arr[i] << endl;
//         }
//         for (int i = mid-1; i >= 0; --i)
//         {
//             cout << arr[i] << endl;
//         }
//     }

//     else
//     {
//         for (int i = 0; i <= mid; ++i)
//         {
//             arr[i] = 2 * n - (2 * i + 2);
//             cout << arr[i] << endl;
//         }
//         for (int i = mid-1; i >= 0; --i)
//         {
//             cout << arr[i] << endl;
//         }
//     }

//     return 0;
// }

//刷题统计
// #include <iostream>
// using namespace std;

// int main()
// {
//     int a, b, n;
//     cin >> a >> b >> n;
//     int q = 0;
//     int i = 1;
//     while (q < n)
//     {
//         if (i % 6 == 0 || i % 7 == 0)
//         {
//             q += b;
//         }
//         else
//         {
//             q += a;
//         }
//         ++i;
//     }
//     cout << i - 1 << endl;

//     return 0;
// }
// int main()
// {
//     long long a, b, n;
//     cin >> a >> b >> n;

//     long long a_week = a*5 + b*2;
//     long long week = n / a_week;
//     long long q = week * a_week;

//     long long day = week * 7;
//     while (q < n)
//     {
//         ++day;
//         if (day % 6 == 0 || day % 7 == 0)
//         {
//             q += b;
//         }
//         else
//         {
//             q += a;
//         }
//     }
//     cout << day << endl;

//     return 0;
// }

//统计字符
// #include <iostream>
// #include <map>
// #include <string>
// #include <algorithm>
// using namespace std;
// int main()
// {
//     map<char, int> hash;
//     string str;
//     cin >> str;

//     int maxch = 0;
//     for (auto ch : str)
//     {
//         ++hash[ch];
//         maxch = max(maxch, hash[ch]);
//     }

//     for (auto& hs : hash)
//     {
//         if (hs.second == maxch)
//         {
//             cout << hs.first;
//         }
//     }

//     return 0;
// }

//X进制减法
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int MOD = 1000000007;

int main()
{
    int N, Ma, Mb;
    vector<int> numA;
    vector<int> numB;

    cin >> N;

    cin >> Ma;
    numA.reserve(Ma);
    for (int i = Ma-1; i >= 0; --i)
    {
        cin >> numA[i];
    }

    cin >> Mb;
    numB.reserve(Mb);
    for (int i = Mb-1; i >= 0; --i)
    {
        cin >> numB[i];
    }

    long long ret = 0;
    long long flag = 1;
    long long weight = 0;
    int minAB = min(Ma, Mb);
    bool flagA = Ma > Mb;
    for (int i = 0; i < minAB; ++i)
    {
        weight = max(max(numA[i], numB[i]) + 1, 2);
        ret = (ret + (numA[i] - numB[i]) * flag) % MOD;
        flag = (flag * weight) % MOD;
    }

    if (flagA)
    {
        for (int i = minAB; i<Ma; ++i)
        {
            weight = max(numA[i] + 1, 2);
            ret = (ret + numA[i]*flag) % MOD;
            flag = (flag*weight) % MOD;
        }
    }
    else 
    {
        for (int i = minAB; i<Mb; ++i)
        {
            weight = max(numB[i] + 1, 2);
            ret = (ret + numB[i]*flag) % MOD;
            flag = (flag*weight) % MOD;
        }
    }

    cout << ret << endl;

    return 0;
}